package us.kg.kotoriforest.base;

import java.sql.*;

public class JDBCQuickOpen {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        // 注册驱动 加载 JDBC 驱动
//        Class.forName("com.mysql.cj.jdbc.Driver");
//        DriverManager.registerDriver(new Driver()); // 上面的语句实际上做的就是当前操作
        /*
         * 从 JDK6 开始 就不需要显示的加载驱动了 Java 会自动去找 java.sql.Driver 接口的实现对象 所以我们只需要导入对应的 jar 包就可以了
         * 那么 Java 是怎么去找的呢？一个一个遍历吗？当然不是
         * Java 会在驱动 jar 包中的 \META-INF\services\java.sql.Driver 文件中去找
         * 这个文件里面就写明了 JDBC 的驱动类的全类名 com.mysql.cj.jdbc.Driver
         * 文件名是接口名 文件的内容是该接口实现类的全类名
         *
         * 注意 不带 cj 的 com.mysql.jdbc.Driver 是 MySQL5.? 版本的驱动
         * */

        // 获得连接对象
        // jdbc:数据库类别://数据库的ip地址:数据库端口号/数据库名
        // 数据库名 是数据库的种类 如 MySQL、SQL server、Oracle...
        // 数据库的 ip、数据库端口号中的数据库 指的是 DBMS
        // 数据库名 指的是存放表的数据库的名字 是 DBMS 所管理的数据库 而不是 DBMS
        String url = "jdbc:mysql:///JDBC"; // 代表本机3306接口
        String username = "root"; // 操作数据库的用户的用户名
        String password = "";
        Connection connection = DriverManager.getConnection(url, username, password);
        /*
         * Connection 对象用于建立与数据库的通信通道 只要 Connection 不为空就代表着一次数据库连接
         * 所以在使用完后一定要记得关闭 Connection 不能一直占用连接浪费系统资源
         * */

        // 获取执行 SQL 语句的对象
        // Statement 可能会产生 SQL注入问题 可以用 PreparedStatement 解决这个问题
        Statement statement = connection.createStatement();

        // 编写 SQL 并执行
        String SQL = "SELECT * FROM t_emp";
        ResultSet resultSet = statement.executeQuery(SQL);

        // 遍历结果集 只有查询语句的结果才会被构建成结果集对象
        while (resultSet.next()) {
            int empId = resultSet.getInt("emp_id");
            String empName = resultSet.getString("emp_name");
            double empSalary = resultSet.getDouble("emp_salary");
            int empAge = resultSet.getInt("emp_age");
            System.out.println(empId + "\t" + empName + "\t" + empSalary + "\t" + empAge);
        }

        // 由外到内关闭资源
        resultSet.close();
        statement.close();
        connection.close();
    }
}
